<script>
	import Vue from 'vue'
	import {
		getImLogin,
		loginTUICallKit
	} from './commen/login.js'
	export default {
		onLaunch: function() {
			this.$store.commit('initApp')
			uni.getSystemInfo({
				success: function(e) {
					// #ifndef MP
					Vue.prototype.StatusBar = e.statusBarHeight
					if (e.platform == 'android') {
						Vue.prototype.CustomBar = e.statusBarHeight + 50
					} else {
						Vue.prototype.CustomBar = e.statusBarHeight + 45
					}
					// #endif
					// #ifdef MP-WEIXIN
					Vue.prototype.StatusBar = e.statusBarHeight
					let custom = wx.getMenuButtonBoundingClientRect()
					Vue.prototype.Custom = custom
					Vue.prototype.CustomBar = custom.bottom + custom.top - e.statusBarHeight
					// #endif
					// #ifdef MP-ALIPAY
					Vue.prototype.StatusBar = e.statusBarHeight
					Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight
					// #endif
					let unitRatio = 750 / uni.getSystemInfoSync().windowWidth
					Vue.prototype.StatusBarRpx = Vue.prototype.StatusBar * unitRatio
					Vue.prototype.CustomBarRpx = Vue.prototype.CustomBar * unitRatio
					Vue.prototype.unitRatio = unitRatio
					Vue.mixin({
						data() {
							return {
								StatusBar: Vue.prototype.StatusBar, //状态栏高度(px)
								CustomBar: Vue.prototype.CustomBar, //整个标题栏高度(px)
								StatusBarRpx: Vue.prototype.StatusBarRpx, //状态栏高度(rpx)
								CustomBarRpx: Vue.prototype.CustomBarRpx, //整个标题栏高度(rpx)
							}
						},
					})
				},
			})
			// #ifdef APP-PLUS
			// 锁定屏幕显示方向为竖屏正方向
			plus.screen.lockOrientation('portrait-primary')
			// 推送服务
			// plus.push.addEventListener('click', (message) => {
			//   this.pushCallback(message)
			// })
			// #endif
			global.token && this.$store.dispatch('getCartList')

			this.initTIM();
			
			if (!uni.getStorageSync('is_protocol')) {
				uni.setStorageSync('is_protocol', 0);
			}
		},
		onShow: function() {
			console.log('APP Show')
			// #ifdef APP-PLUS
			// 获取参数
			const args = plus.runtime.arguments
			if (args) {
				plus.runtime.arguments = null
				plus.runtime.arguments = ''
				let params_str = args.split('?')[1]
				if (params_str) {
					let params = params_str.split('&').reduce(function(total, item) {
						let arr = item.split('=')
						total[arr[0]] = arr[1]
						return total
					}, {})
					console.log('params', params)
					// params 参数: path 跳转路径 options 参数
					uni.navigateTo({
						url: `${params.path}?goods_id=${params.goods_id}&activity_id=${params.activity_id}&sku_id=${params.sku_id}&bargain_id=${params.bargain_id}`,
					})
				}
			}

			let _this = this;
			uni.onNetworkStatusChange(function(res) {
				if (res.isConnected) {
					_this.initTIM();
				} else {
					// if (_this.tim) {
					// 	_this.tim.logout();
					// }
				}
			});
			// #endif
		},
		onHide: function() {
			// 用户退出app时，把二次验证状态改为true
			console.log('APP Hide')
		},
		mounted() {
			/**官网有很多关于关于sdk 其他的监听方法（比如：有新的消息，用户资料更新等等）
			 * 详情可对照： https://imsdk-1252463788.file.myqcloud.com/IM_DOC/Web/SDK.html
			 * 监听的含义：服务端发生了数据变更---前端全局可以接收到变更通知--前端就可以自动触发某个事件来更新相应数据
			 * */
			// 登录成功后会触发 SDK_READY 事件，该事件触发后，可正常使用 SDK 接口
			this.tim.on(this.$TIM.EVENT.SDK_READY, this.onReadyStateUpdate, this);
			// 收到新消息提示音
			this.tim.on(this.$TIM.EVENT.MESSAGE_RECEIVED, this.onReceiveMessage);
			// 会话列表更新
			this.tim.on(this.$TIM.EVENT.CONVERSATION_LIST_UPDATED, event => {
				this.$store.commit('updateConversationList', event.data);
			});
		},
		methods: {
			// 推送回调
			pushCallback(message) {
				this.$urouter.navigateTo('/pages/service-message/message/message-type/index')
			},
			onReadyStateUpdate({
				name
			}) {
				const isSDKReady = name === this.$TIM.EVENT.SDK_READY ? true : false;
				//自动监听并更新 sdk 的ready 状态 （未登录是 notReady  登录后是ready）
				this.$store.commit('toggleIsSDKReady', isSDKReady);
				// console.log(this.$store.state.userInfo);
				if (isSDKReady) {
					setTimeout(() => {
						this.getConversationList(this.tim, this.$store);
					}, 500)
					setTimeout(() => {
						// 修改个人标配资料
						let promises = this.tim.updateMyProfile({
							nick: this.$store.state.userInfo.user_nickname,
							avatar: this.$store.state.userInfo.head_img,
							gender: this.$store.state.userInfo.sex == 1 ?
								this.$TIM.TYPES.GENDER_MALE : this.$TIM.TYPES.GENDER_FEMALE,
							selfSignature: this.$store.state.userInfo.id.toString(),
							location: this.$store.state.userInfo.country + ' ' + this.$store.state.userInfo
								.city + ' ' + this.$store.state.userInfo.area,
							allowType: this.$TIM.TYPES.ALLOW_TYPE_ALLOW_ANY
						});
						promises
							.then(function(imResponse) {
								console.log(imResponse.data, "更新资料成功"); // 更新资料成功
							})
							.catch(function(imError) {
								console.warn("updateMyProfile error:", imError); // 更新资料失败的相关信息
							});
					}, 300);
				}
				//sdk ready 后  肯定完成了登录操作    这里可以获取用户存储在im的基础信息/离线消息/黑名单列表
			},

			onReceiveMessage({
				data: messageList
			}) {
				// this.handleAt(messageList);
				this.$store.commit('pushCurrentMessageList', messageList);
				this.getConversationList(this.tim, this.$store);

				// let music = null;
				// music = uni.createInnerAudioContext();
				// // 提示音需要放到线上，并提供在线地址才可使用
				// music.src = 'https://app.xinzhichuangxiang.com/uploads/audio/notice.mp3';
				// music.play();
				// music.onEnded(() => {
				// 	music = null;
				// })
				/** 新消息声音提示 */
				// let noticeAudio = new PlayNoticeAudio();

			},
			getConversationList(tim, store) {
				// 拉取会话列表
				let promise = tim.getConversationList();
				promise
					.then(res => {
						let conversationList = res.data.conversationList; // 会话列表，用该列表覆盖原有的会话列表
						if (conversationList.length) {
							//将返回的会话列表拼接上 用户的基本资料
							//说明：如果已经将用户信息 提交到tim服务端了 就不需要再次拼接
							store.commit('updateConversationList', conversationList);
							// console.log('消息列表=====', conversationList);
						}
						this.getUserInfo(conversationList)
					})
					.catch(err => {
						console.warn('getConversationList error:', err); // 获取会话列表失败的相关信息
					});
			},
			getUserInfo(conversationList) {
				var userAddConversationList = [];
				var arr = [];
				var userList = [];

				conversationList.forEach(item => {
					let obj = {};
					obj.conversation = item;
					userList.forEach(item1 => {
						if (item.toAccount == item1.userId) {
							obj.user = item1;
						}
					});
					arr.push(JSON.parse(JSON.stringify(obj)));
				});
				userAddConversationList = arr;
				this.updateTabBarBadge(userAddConversationList);
			},
			// 更新消息角标
			updateTabBarBadge(userAddConversationList) {
				var count = 0;
				count += userAddConversationList.reduce((pre, t) => {
					return pre + t.conversation.unreadCount
				}, 0);
				// if (count) {
				// 	uni.setTabBarBadge({
				// 		index: 2,
				// 		text: `${count}`
				// 	})
				// } else {
				// 	uni.removeTabBarBadge({
				// 		index: 2
				// 	})
				// }
				this.$store.commit('getNewsCount', count);
				// #ifdef APP-PLUS
				plus.runtime.setBadgeNumber(count);
				// #endif
			},
			//根据消息列表请求聊天对象的用户信息 并完成数据拼接
			initTIM() {
				const self = this;
				// console.log('是否登录====', this.$store.getters.userInfo);
				if (this.$store.getters.userInfo.id) {
					let options = {
						t_user_id: self.$store.getters.userInfo.t_user_id,
						user_sig: self.$store.getters.userInfo.user_sig,
					}
					getImLogin(options);
					loginTUICallKit(options);
					return;

					// 腾讯IM
					let promise = this.tim.login({
						userID: self.$store.getters.userInfo.t_user_id,
						userSig: self.$store.getters.userInfo.user_sig
					});
					promise
						.then(res => {
							console.log('Im-------', res);
							//登录成功后 更新登录状态
							this.$store.commit('toggleIsLogin', true);
							//自己平台的用户基础信息
							uni.setStorageSync('userInfo', JSON.stringify(userInfo));
							//tim 返回的用户信息
							uni.setStorageSync('userTIMInfo', JSON.stringify(res.data));

							// 推送
							// console.log(self.tim);
							// self.tim.registerPlugin({
							// 	'tim-offline-push-plugin': TUIOfflinePush,
							// 	'offlinePushConfig': {
							// 		// huawei
							// 		'huaweiBusinessID': '27054', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
							// 		// xiaomi
							// 		'xiaomiBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
							// 		'xiaomiAppID': '', // 小米开放平台分配的应用 APPID
							// 		'xiaomiAppKey': '', // 小米开放平台分配的应用 APPKEY
							// 		// meizu
							// 		'meizuBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
							// 		'meizuAppID': '', // 魅族开放平台分配的应用 APPID
							// 		'meizuAppKey': '', // 魅族开放平台分配的应用 APPKEY
							// 		// vivo
							// 		'vivoBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
							// 		// oppo
							// 		'oppoBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
							// 		'oppoAppKey': '', // oppo 开放平台分配的应用 APPID
							// 		'oppoAppSecret': '', //
							// 		// ios
							// 		'iosBusinessID': '36384', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
							// 	}
							// });
						})
						.catch(err => {
							console.warn('login error:', err); // 登录失败的相关信息
						});
					// end
					// #ifdef APP-PLUS
					// const options = {
					// 	SDKAppID: 1400738535, // 请替换为步骤一取到的 SDKAppID
					// 	userID: self.$store.getters.userInfo.t_user_id,
					// 	userSig: self.$store.getters.userInfo.user_sig
					// };
					// this.TUICallKit.login(options, (res) => {
					// 	if (res.code === 0) {
					// 		console.log('login success');
					// 		this.TUICallKit.enableFloatWindow(true);
					// 	} else {
					// 		console.log(`login failed, error message = ${res.msg}`);
					// 	}
					// });
					// #endif
				}
				

			},
			

			// 推送回调
			pushCallback(message) {
				this.$urouter.navigateTo('/pages/service-message/message/message-type/index')
			},
			// #ifdef APP-PLUS
			// 权限检查
			checkPermissions() {
				// #ifdef APP-PLUS
				if (plus.os.name == 'Android') {
					// 判断是Android
					var main = plus.android.runtimeMainActivity()
					var pkName = main.getPackageName()
					var uid = main.getApplicationInfo().plusGetAttribute('uid')
					var NotificationManagerCompat = plus.android.importClass(
						'android.support.v4.app.NotificationManagerCompat')
					var areNotificationsEnabled = NotificationManagerCompat.from(main).areNotificationsEnabled()
					// 未开通‘允许通知’权限，则弹窗提醒开通，并点击确认后，跳转到系统设置页面进行设置
					if (!areNotificationsEnabled) {
						uni.showModal({
							title: this.$t('通知权限开启提醒'),
							content: this.$t('您还没有开启通知权限，无法接受到消息通知，是否前往设置？'),
							success: function(res) {
								if (res.confirm) {
									var Intent = plus.android.importClass('android.content.Intent')
									var Build = plus.android.importClass('android.os.Build')
									//android 8.0引导
									if (Build.VERSION.SDK_INT >= 26) {
										var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS')
										intent.putExtra('android.provider.extra.APP_PACKAGE', pkName)
									} else if (Build.VERSION.SDK_INT >= 21) {
										//android 5.0-7.0
										var intent = new Intent('android.settings.APP_NOTIFICATION_SETTINGS')
										intent.putExtra('app_package', pkName)
										intent.putExtra('app_uid', uid)
									} else {
										//(<21)其他--跳转到该应用管理的详情页
										intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
										var uri = Uri.fromParts('package', mainActivity.getPackageName(), null)
										intent.setData(uri)
									}
									// 跳转到该应用的系统通知设置页
									main.startActivity(intent)
								}
							},
						})
					}
				} else if (plus.os.name == 'iOS') {
					// 判断是IOS
					var isOn = undefined
					var types = 0
					var app = plus.ios.invoke('UIApplication', 'sharedApplication')
					var settings = plus.ios.invoke(app, 'currentUserNotificationSettings')
					if (settings) {
						types = settings.plusGetAttribute('types')
						plus.ios.deleteObject(settings)
					} else {
						types = plus.ios.invoke(app, 'enabledRemoteNotificationTypes')
					}
					plus.ios.deleteObject(app)
					isOn = 0 != types
					if (isOn == false) {
						uni.showModal({
							title: this.$t('通知权限开启提醒'),
							content: this.$t('您还没有开启通知权限，无法接受到消息通知，是否前往设置？'),
							success: function(res) {
								if (res.confirm) {
									var app = plus.ios.invoke('UIApplication', 'sharedApplication')
									var setting = plus.ios.invoke('NSURL', 'URLWithString:', 'app-settings:')
									plus.ios.invoke(app, 'openURL:', setting)
									plus.ios.deleteObject(setting)
									plus.ios.deleteObject(app)
								}
							},
						})
					}
				}
				// #endif
			},
			// #endif
		},
	}
</script>

<style lang="scss">
	@import "uview-ui/index.scss";
	/* #ifndef APP-PLUS-NVUE */
	@import './style/icon.css';
	@import './style/main.css';
	@import './style/animation.css';
	@import './style/iconfont.css';
	@import './style/common.scss';
	@import './style/diyStyle.scss';
	/* #endif */
</style>